# 步骤 1: 创建抽象表达式
class Expression:
    def interpret(self, context):
        pass


# 步骤 2: 创建终结符表达式
class Number(Expression):
    def __init__(self, value):
        self.value = value

    def interpret(self, context):
        return self.value


# 步骤 3: 创建非终结符表达式
class Add(Expression):
    def __init__(self, left, right):
        self.left = left
        self.right = right

    def interpret(self, context):
        print(self.left.interpret(context), self.right.interpret(context))
        print(self.left, self.right)
        return self.left.interpret(context) + self.right.interpret(context)


class Subtract(Expression):
    def __init__(self, left, right):
        self.left = left
        self.right = right

    def interpret(self, context):
        print(self.left.interpret(context), self.right.interpret(context))
        print(self.left, self.right)
        return self.left.interpret(context) - self.right.interpret(context)


# 步骤 4: 使用解释器
# 上下文可以是更复杂的数据结构，在这个例子中我们简化处理，没有具体使用。
context = {}

# 构建表达式树
expression = Add(Number(5), Subtract(Number(10), Number(3)))  # 解释 5 + (10 - 3)
print(expression)

# expression = Subtract(Number(10), Number(3))

# 解释表达式
result = expression.interpret(context)
print(result)  # 输出: 12

"""
<__main__.Add object at 0x000001B34524AA10>
10 3
<__main__.Number object at 0x000001B34524A990> <__main__.Number object at 0x000001B34524A8D0>
5 7
<__main__.Number object at 0x000001B34524A9D0> <__main__.Subtract object at 0x000001B34524A7D0>
10 3
<__main__.Number object at 0x000001B34524A990> <__main__.Number object at 0x000001B34524A8D0>
12
"""
